﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CapaNegocio;
using CapaDatos;
using System.Collections;

public partial class abmPresupuesto_realizarPresupuesto : System.Web.UI.Page
{
    const int FILTRO_MINIMO = 32;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["UsuLogin"] == null)
        {
            Response.Redirect("../Default.aspx", true);
        }
        else
        {
            if (!IsPostBack)
            {

                Usuario usu = ((Usuario)(Session["UsuLogin"]));
                Label6.Text = usu.Apellido + ", " + usu.Nombre + " (" + usu.Perfil.Nombre + ")";

                Session["PrecioFinal"] = 0;
                Session["PrecioBase"] = 0;
                Session["accDic"] = new Dictionary<int, int>();
                Session["catDic"] = new Dictionary<int, int>();
                Session["precioRevest"] = 0;

                List<Terminacion> terminacionesL = Terminacion.buscarTerminaciones();
                terminaciones.DataSource = terminacionesL;
                terminaciones.DataTextField = "textoAMostrar";
                terminaciones.DataValueField = "id";
                terminaciones.DataBind();

                List<Accesorio> accesoriosL = Accesorio.buscarAccesorios();
                accesorios.DataSource = accesoriosL;
                accesorios.DataTextField = "textoAMostrar";
                accesorios.DataValueField = "id";
                accesorios.DataBind();

                List<Revestimiento> revestimientosL = Revestimiento.buscarRevestimientos();
                revestimientos.DataSource = revestimientosL;
                revestimientos.DataTextField = "textoAMostrar";
                revestimientos.DataValueField = "id";
                revestimientos.DataBind();

                List<Categoria> categorias = Categoria.buscarCategorias();
                categoriasObr.DataSource = categorias;
                categoriasObr.DataTextField = "textoAMostrar";
                categoriasObr.DataValueField = "id";
                categoriasObr.DataBind();


                if (!String.IsNullOrEmpty(Request.QueryString["nroPresupuesto"]))
                {
                    Presupuesto pre = Presupuesto.buscarPresupuesto(Convert.ToInt32(Request.QueryString["nroPresupuesto"]));
                    rellenarPresupuesto(pre);

                    if (Request.QueryString["action"] == "delete") {
                        deshabilitarCampos();
                    }
                }

            }
        }
    }


    private void deshabilitarCampos() {
        //presupuesto
        txtApe.Enabled = false;//0
        textDire.Enabled=false;//1
        txtMail.Enabled=false;//2
        txtNomb.Enabled=false;//3
        txtLocalidad.Enabled=false;//4
        txtTel.Enabled=false;//5
        precioMtr2.Enabled=false;//6

        //natatorio
        txtDireNatat.Enabled = false;
        txtLocalNatat.Enabled = false;
        ancho.Enabled = false;
        largo.Enabled=false;
        profund.Enabled=false;
 
        txtUnidad.Enabled=false;
        revestimientos.Enabled = false;

        botonAgregarAcc.Enabled = false;
        botonAgregarObr.Enabled = false;
        botonQuitarAcc.Enabled = false;
        botonQuitarObr.Enabled = false;
        botonAgregarTerm.Enabled = false;
        botonQuitarTerm.Enabled = false;

        obrerosAgreg.Enabled = false;
        accesorios.Enabled = false;
        accesoriosAgreg.Enabled=false;
        calcularNatatorioBase.Enabled = false;

        terminaciones.Enabled = false;
        terminacionesAgreg.Enabled = false;
        txtCantAcc.Enabled = false;
        categoriasObr.Enabled = false;

        

      
    }
    
    
    

    private void rellenarPresupuesto(Presupuesto pre) {
        //presupuesto
        txtApe.Text=pre.Apellido;//0
        textDire.Text=pre.Direccion;//1
        txtMail.Text=pre.Mail;//2
        txtNomb.Text=pre.Nombre;//3
        txtLocalidad.Text=pre.Localidad;//4
        txtTel.Text=pre.Telefono;//5
        precioMtr2.Text= Convert.ToString(pre.PrecioM2);//6

        //natatorio
        txtDireNatat.Text=pre.Piscina.Direccion;
        txtLocalNatat.Text=pre.Piscina.Localidad;
        ancho.Text = Convert.ToString(pre.Piscina.Ancho);
        largo.Text = Convert.ToString(pre.Piscina.Largo);
        profund.Text= Convert.ToString(pre.Piscina.Profundidad);

        //calculo incial
        calcularNatatorio();

        if (Convert.ToDouble(pre.PrecioRes) != 0)
        {
           txtUnidad.Text=Convert.ToString(pre.PrecioRes);
           revestimientos.SelectedValue = Convert.ToString(pre.Revestimiento.Id);
           calcRevestimiento();
        }

        //terminaciones
        if (pre.Terminaciones != null)
        {
            foreach (TerminacionPresupuesto termPresup in pre.Terminaciones)
            {
                agregarTerminacion(termPresup.Terminacion);
            }
        }

        //accesorios
        if (pre.Accesorios != null)
        {
            foreach (AccesorioPresupuesto accPresup in pre.Accesorios)
            {
                agregarAccesorio(accPresup.Accesorio,accPresup.Cantidad.ToString());
            }
        }

        //categorias

        if (pre.Categorias != null)
        {
            foreach (CategoriaPresupuesto catPresup in pre.Categorias)
            {
                agregarCategoria(catPresup.Categoria, catPresup.Cantidad.ToString());
            }
        }
    }


    private void agregarCategoria(Categoria categoria, string cant) {
        ((Dictionary<int, int>)Session["catDic"]).Add(categoria.Id, Convert.ToInt32(cant));
        obrerosAgreg.Items.Add(new ListItem(categoria.TextoAMostrar + "(" + cant + ")", categoria.Id.ToString()));
        double precio = categoria.Jornal * Convert.ToInt32(cant);
        precio = Convert.ToDouble(Session["PrecioFinal"]) + precio;
        Session["PrecioFinal"] = precio;
        precioFinalLabel.Text = precio.ToString();
        txtCantCateg.Text = "1";
    
    }

    private void agregarTerminacion(Terminacion term){
        double precio = Convert.ToDouble(Session["PrecioFinal"]) + term.Precio;
        Session["PrecioFinal"] = precio;
        precioFinalLabel.Text = precio.ToString();
        terminacionesAgreg.Items.Add(new ListItem(term.TextoAMostrar, term.Id.ToString()));
        ListItem i= terminaciones.Items.FindByText(term.TextoAMostrar);
        terminaciones.Items.Remove(i);
        
    }

    private void agregarAccesorio(Accesorio accesorio, string cant) {
        ((Dictionary<int, int>)Session["accDic"]).Add(accesorio.Id, Convert.ToInt32(cant));
        accesoriosAgreg.Items.Add(new ListItem(accesorio.TextoAMostrar + "(" + cant + ")", accesorio.Id.ToString()));
        double precio = accesorio.Precio * Convert.ToInt32(cant);
        precio = Convert.ToDouble(Session["PrecioFinal"]) + precio;
        Session["PrecioFinal"] = precio;
        precioFinalLabel.Text = precio.ToString();
        txtCantAcc.Text = "1";
    }


    protected void botonAgregarTerm_Click(object sender, EventArgs e)
    {
        if (terminaciones.SelectedItem!=null){
            Terminacion terminacion = Terminacion.buscarTerminacion(Convert.ToInt32(terminaciones.SelectedValue));
            agregarTerminacion(terminacion);   
        }
    }

    protected void botonQuitarTerm_Click(object sender, EventArgs e)
    {
        if (terminacionesAgreg.SelectedItem != null)
        {
            Terminacion terminacion = Terminacion.buscarTerminacion(Convert.ToInt32(terminacionesAgreg.SelectedValue));
            double precio = Convert.ToDouble(Session["PrecioFinal"]) - terminacion.Precio;
            Session["PrecioFinal"] = precio;
            precioFinalLabel.Text = precio.ToString();
            terminaciones.Items.Add(new ListItem(terminacionesAgreg.SelectedItem.Text, terminacionesAgreg.SelectedValue.ToString()));
            terminacionesAgreg.Items.Remove(terminacionesAgreg.SelectedItem);
        }
    }

    private void calcularNatatorio() {
        double precioBase = Convert.ToDouble(ancho.Text) * Convert.ToDouble(largo.Text) * Convert.ToDouble(precioMtr2.Text);

        if (Convert.ToDouble(Session["PrecioBase"]) > 0)
            Session["PrecioFinal"] = Convert.ToDouble(Session["PrecioFinal"]) - Convert.ToDouble(Session["PrecioBase"]);

        Session["PrecioBase"] = precioBase;
        Session["PrecioFinal"] = Convert.ToDouble(Session["PrecioFinal"]) + Convert.ToDouble(Session["PrecioBase"]);
        precioFinalLabel.Text = ((double)Session["PrecioFinal"]).ToString();
        labelPrecioBase.Text = precioBase.ToString();
        labelFiltroBase.Text = calcularFiltro();
    }

    protected void calcularNatatorioBase_Click(object sender, EventArgs e)
    {
        mensajeErrorNatBase.Visible = false;
        if (!String.IsNullOrEmpty(ancho.Text) &&
            !String.IsNullOrEmpty(largo.Text) &&
            !String.IsNullOrEmpty(precioMtr2.Text))
        {
            calcularNatatorio();
           
        }
        else
        {
           mensajeErrorNatBase.Visible = true;
           mensajeErrorNatBase.Text = "Para calcular el 'Precio Base' del natatorio es necesario: Ancho,Largo,Precio mtr. 2";
        }  
    }

    private String calcularFiltro()
    {
        int hp = Convert.ToInt32(Math.Ceiling((Convert.ToDouble(ancho.Text) *
                        Convert.ToDouble(largo.Text)) / 32));
        return hp.ToString() + " (HPM)";
    }

    private String calcularRevestimiento(){
        double precio = 0;
        if (Convert.ToInt32(revestimientos.SelectedValue) == (int)RevestimientoEnum.REVEST_LINEAL)
        {
            precio = (Convert.ToDouble(ancho.Text) +
                Convert.ToDouble(largo.Text)) *
                2 *
                Convert.ToDouble(txtUnidad.Text);
        }
        else
        {

            precio = ((Convert.ToDouble(ancho.Text)*2*2) +
                    (Convert.ToDouble(largo.Text) * 2 * 2)) *
                    Convert.ToDouble(txtUnidad.Text);
        }
        return precio.ToString();
    }
    
    

    protected void botonVolver_Click(object sender, EventArgs e)
    {
       Response.Redirect("../MenuAdministrativo.aspx");
    }

    protected void botonAgregarAcc_Click(object sender, EventArgs e)
    {
        mensajeErrorAcc.Visible = false;    
        if (accesorios.SelectedValue != null)
        {
            Accesorio accesorio =
                Accesorio.buscarAccesorio
                (Convert.ToInt32(accesorios.SelectedValue));
            try
            {
                agregarAccesorio(accesorio, txtCantAcc.Text);
            }
            catch (ArgumentException ex) {
                string mensaje = ex.Message;
                mensajeErrorAcc.Visible = true;
                mensajeErrorAcc.Text = "EL accesorio que intenta agregar ya existe. Si desea modificar la cantidad, eliminelo de la lista e ingreselo nuevamente.";
            }
            

        }
    }

    protected void botonQuitarAcc_Click(object sender, EventArgs e)
    {
        mensajeErrorAcc.Visible = false;
        if (accesoriosAgreg.SelectedItem != null)
        {
            Accesorio accesorio = Accesorio.buscarAccesorio(Convert.ToInt32(accesoriosAgreg.SelectedItem.Value));
            int cant=0;
            foreach(KeyValuePair<int,int> i in ((Dictionary<int, int>)Session["accDic"])){
                if (i.Key == accesorio.Id){
                    ((Dictionary<int, int>)Session["accDic"]).Remove(i.Key);
                    accesoriosAgreg.Items.Remove(accesoriosAgreg.SelectedItem);
                    cant = i.Value;
                    break;
                }
            }
            double precio = Convert.ToDouble(Session["PrecioFinal"]) - (accesorio.Precio*cant);
            Session["PrecioFinal"] = precio;
            precioFinalLabel.Text = precio.ToString();

        }

        
      
    }

    protected void botonAgregarObr_Click(object sender, EventArgs e)
    {
        Label7.Visible = false;
        if (categoriasObr.SelectedValue != null)
        {
            Categoria categoria =
                Categoria.buscarCategoria
                (Convert.ToInt32(categoriasObr.SelectedValue));

            try
            {
                agregarCategoria(categoria, txtCantCateg.Text);                
            }
            catch(ArgumentException ex) { 
                string mensaje = ex.Message;
                Label7.Visible = true;
                Label7.Text = "La categoria que intenta agregar ya existe. Si desea modificar la cantidad, eliminela de la lista e ingresela nuevamente.";
            }
            

        }
    
    }

    private void calcRevestimiento() {

        cantLabel.Text = calcularRevestimiento();
        double precio = Convert.ToDouble(cantLabel.Text);
        Session["precioRevest"] = precio;
        precio = Convert.ToDouble(Session["PrecioFinal"]) + precio;
        Session["PrecioFinal"] = precio;
        precioFinalLabel.Text = precio.ToString();
    
    }

    protected void revestimientos_SelectedIndexChanged(object sender, EventArgs e)
    {
        Label9.Visible = false;
        if (Convert.ToInt32(revestimientos.SelectedValue) != (int)RevestimientoEnum.SIN_REVEST)
        {
            if (!String.IsNullOrEmpty(ancho.Text) &&
            !String.IsNullOrEmpty(largo.Text) &&
            !String.IsNullOrEmpty(txtUnidad.Text))
            {
                calcRevestimiento();
            }
            else
            {
                Label9.Visible = true;
                Label9.Text = "Para calcular el 'Revestimiento' del natatorio es necesario: Ancho,Largo,Precio Unitario($)";
            }
        }
        else {
            cantLabel.Text = "";
            txtUnidad.Text = "";
            double precio = Convert.ToDouble(Session["PrecioFinal"]) - Convert.ToDouble(Session["precioRevest"]);
            Session["PrecioFinal"] = precio;
            precioFinalLabel.Text = precio.ToString();
        
        }
       
    }

    protected void botonQuitarObr_Click(object sender, EventArgs e)
    {
        Label7.Visible = false;
        if (obrerosAgreg.SelectedItem != null)
        {
            Categoria categoria = Categoria.buscarCategoria(Convert.ToInt32(obrerosAgreg.SelectedItem.Value));
            int cant = 0;
            foreach (KeyValuePair<int, int> i in ((Dictionary<int, int>)Session["catDic"]))
            {
                if (i.Key == categoria.Id)
                {
                    ((Dictionary<int, int>)Session["catDic"]).Remove(i.Key);
                    obrerosAgreg.Items.Remove(obrerosAgreg.SelectedItem);
                    cant = i.Value;
                    break;
                }
            }
            double precio = Convert.ToDouble(Session["PrecioFinal"]) - (categoria.Jornal * cant);
            Session["PrecioFinal"] = precio;
            precioFinalLabel.Text = precio.ToString();
        }
    }

    protected void realizarPresup_Click(object sender, EventArgs e)
    {

        if (Request.QueryString["action"] == "delete")
        {
            Presupuesto pre = Presupuesto.buscarPresupuesto(Convert.ToInt64(Request.QueryString["nroPresupuesto"]));
            bool ok = pre.eliminar();
            if (ok)
            {
                Session["ruta"] = "MenuAdministrativo.aspx";
                Session["mensaje"] = "Se ha eliminado el presupuesto: " + Request.QueryString["nroPresupuesto"];
                Response.Redirect("../Exito.aspx");
            }
            else
            {
                Session["error"] = "El presupuesto no puede eliminarse ya que existe una orden de trabajo asociada a la misma.";
                Session["ruta"] = "MenuAdministrativo.aspx";
                Response.Redirect("../Error.aspx");
            }

        }
        else
        {

            //presupuesto
            ArrayList presupuesto = new ArrayList();
            presupuesto.Add(txtApe.Text);//0
            presupuesto.Add(textDire.Text);//1
            presupuesto.Add(txtMail.Text);//2
            presupuesto.Add(txtNomb.Text);//3
            presupuesto.Add(txtLocalidad.Text);//4
            presupuesto.Add(txtTel.Text);//5
            presupuesto.Add(precioMtr2.Text);//6

            //natatorio
            ArrayList natatorio = new ArrayList();
            natatorio.Add(txtDireNatat.Text);
            natatorio.Add(txtLocalNatat.Text);
            natatorio.Add(ancho.Text);
            natatorio.Add(largo.Text);
            natatorio.Add(profund.Text);


            presupuesto.Add(natatorio);//7

            //terminaciones
            ArrayList terminaciones = new ArrayList();
            foreach (ListItem listItem in terminacionesAgreg.Items)
            {
                int codigo = Convert.ToInt32(listItem.Value);
                terminaciones.Add(codigo);
            }
            presupuesto.Add(terminaciones);//8

            //accesorios
            Dictionary<int, int> accesorios = (Dictionary<int, int>)Session["accDic"];
            presupuesto.Add(accesorios);//9

            //categorias
            Dictionary<int, int> categorias = (Dictionary<int, int>)Session["catDic"];
            presupuesto.Add(categorias);//10

            //revestimiento
            if (Convert.ToDouble(Session["precioRevest"]) != 0)
            {
                presupuesto.Add(txtUnidad.Text);//11
                presupuesto.Add(revestimientos.SelectedValue);//12
            }
            else
            {
                presupuesto.Add(0);//11
                presupuesto.Add((int)RevestimientoEnum.SIN_REVEST);//12
            }

            if (Request.QueryString["action"] == "edit")
            {
                Presupuesto pre = Presupuesto.buscarPresupuesto(Convert.ToInt64(Request.QueryString["nroPresupuesto"]));
                bool ok = pre.actualizar(presupuesto);

                if (ok)
                {
                    Session["ruta"] = "MenuAdministrativo.aspx";
                    Session["mensaje"] = "Se ha modificado el presupuesto: " + Request.QueryString["nroPresupuesto"];
                    Response.Redirect("../Exito.aspx");
                }
                else
                {
                    Session["error"] = "El presupuesto ya no puede ser modificado ya que tiene una orden de trabajo asociada. Elimine la orden e intente modificar el presupuesto nuevamente.";
                    Session["ruta"] = "MenuAdministrativo.aspx";
                    Response.Redirect("../Error.aspx");
                }
            }
            else {

                long numPre = Presupuesto.crear(presupuesto);

                if (numPre > 0)
                {
                    Session["ruta"] = "MenuAdministrativo.aspx";
                    Session["mensaje"] = "Se ha creado el presupuesto: " + numPre.ToString();
                    Response.Redirect("../Exito.aspx");
                }
                else
                {
                    Session["error"] = "Se produjo un error inesperado al intentar crear el presupuesto";
                    Session["ruta"] = "MenuAdministrativo.aspx";
                    Response.Redirect("../Error.aspx");
                }
            
            }


            
           
        }
    }

}
